// ==UserScript==
// @name      股票实时价格获取
// @namespace  http://apz.homepage.com/
// @version    1.0.0
// @description  当前脚本用于获取实时股票价格
// @match      *://10.254.2.61:8082/*
// @copyright  2023+, You
// @author       安平智
// @icon         images/txt.png
// @require      /js/jquery-3.4.1.js
// @grant       GM.setValue
// @grant       GM.getValue
// @grant       GM_xmlhttpRequest
// @connect     https://web.sqt.gtimg.cn/*
// ==/UserScript==
//@connect跨域访问的外部地址
// console.log("参数说明：")
// console.log("@name 是用于指定脚本名称的元数据指令之一。通过设置 @name 参数，您可以为脚本提供一个可读性强的名称，以便用户能够辨识和理解脚本的作用。")
// console.log("@namespace 是用于指定脚本的命名空间的元数据指令之一。通过设置 @namespace 参数，您可以为脚本指定一个唯一的标识符，以避免与其他脚本冲突。")
// console.log("@match 是用于指定脚本匹配哪些网址的元数据指令之一。通过设置 @match 参数，您可以控制脚本在特定的网址上执行，允许多行标注")
// console.log("@match https://example.com/*：匹配以 https://example.com/ 开头的所有网址。")
// console.log("@match http://*.google.com/*：匹配以 http:// 开头，后跟任意子域名，最后以 google.com/ 结尾的所有网址")
// console.log("@match @match *://*.stackoverflow.com/*：匹配以任意协议开头，然后是任意子域名，最后以 stackoverflow.com/ 结尾的所有网址")
// console.log("@description：当前脚本描述信息")
// console.log("@author：设计人")
// console.log("@icon:当前脚本的显示图标，从网上获取或从本地扩展获取，缺省是本地扩展中获取")
// console.log("@copyright：版权信息")
// console.log("@version：这个脚本的版本号")
// console.log("@grant 参数是用于声明所需权限的指令之一。它用于告知油猴脚本管理器您的脚本需要哪些额外的功能或访问权限，允许多行标注")
// console.log("none：默认值，表示脚本不需要任何额外的权限")
// console.log("GM_addStyle：允许脚本使用 GM_addStyle 方法来添加样式")
// console.log("GM_xmlhttpRequest：允许脚本进行跨源的 XMLHTTP 请求")
// console.log("GM_registerMenuCommand：允许脚本在 Tampermonkey 菜单中注册自定义命令")
// console.log("GM_getValue：允许脚本读取存储在 GM 存储区的值")
// console.log("GM_setValue：允许脚本将值存储到 GM 存储区")
// console.log("GM_deleteValue：允许脚本删除 GM 存储区中的值")
// console.log("GM_listValues：允许脚本枚举 GM 存储区中的键值对v")
// console.log("GM_info：允许脚本访问 Tampermonkey 的信息")
// console.log("@require 是用于指定脚本依赖的元数据指令之一。通过设置 @require 参数，您可以指定脚本所需的外部资源，例如 JavaScript、CSS 或其他文件。")
// console.log("@include 是用于指定脚本生效的网页地址的元数据指令之一。通过设置 @include 参数，您可以定义在哪些网页上运行该脚本")
// console.log("@include 指令用于指定匹配网址的规则。你可以使用通配符 * 匹配部分 URL，或使用正则表达式来匹配特定的页面。")
// console.log("例如，@include https://example.com/* 将匹配以 "https://example.com/" 开头的所有网址，而 @include /^https?://(www.)?example.com/ ")
// console.log("将匹配所有以 "https://" 或 "http://" 开头、以 "example.com" 结尾的网址。")
// console.log("@match：@match 指令也用于指定匹配网址的规则，它支持更丰富的匹配模式。@match 使用通配符语法来匹配 URL，其中 * 可以匹配任意字符（除了 /），** 可以匹配任意字符（包括 /）。")
// console.log("例如，@match https://example.com/* 和 @match *://example.com/* 都将匹配以 "https://example.com/" 开头的所有网址。")
// console.log("@match https://**.example.com/* 将匹配以 "https://" 开头，以 ".example.com/" 结尾的所有网址。")
// console.log("@connect跨域访问的外部地址")


(function () {
    //获取股票列表
    const urlHead = "https://web.sqt.gtimg.cn/q="
    const stockLeistUrl = "http://10.254.2.61:8082/stock/retime_custom_stock_buy_view.customStockView/WindowGetStockList"
    const updateURL = "http://10.254.2.61:8082/api/StockPriceUpdate/UpdateStockPrice"
    // let stockDeail = [];
    const FirstStockGet = async (listUrl) => {
        return new Promise((resolve, reject) => {
            // const relve = resolve
            GM_xmlhttpRequest({
                url: listUrl,
                method: "GET",
                headers: {
                    "Content-type": "application/x-www-form-urlencode;charset=utf-8"
                },
                data: "content=erwer",
                onload: function (response) {
                    const ret = JSON.parse(response.responseText)
                    if (ret.length > 0) {
                        // console.log("请求成功:", ret)
                        stockDeail = ret
                        resolve(ret)
                    } else {
                        reject("data is null")
                    }
                },
                onerror: function (response) {
                    console.log("请求失败", response)
                    reject("data is catch")
                }
            })
        })
    }
    //根据列表获取股票价格
    const GetStockPrice = async (stockNo) => {
        let priceUrl = urlHead + stockNo
        return new Promise((resolve, reject) => {
            GM_xmlhttpRequest({
                url: priceUrl,
                method: "GET",
                headers: {
                    "Content-type": "application/x-www-form-urlencode;charset=utf-8"
                },
                data: "content=erwer",
                onload: function (response) {
                    
                    const ret = response.response.split("~")
                    if (ret.length > 0) {
                        // console.log("stock 请求成功:", ret)

                        // resolve(JSON.stringify({stName:ret[1],stCode:ret[2],stPrice:ret[3]}))
                        resolve({stName:ret[1],stCode:ret[2],stPrice:ret[3]})
                    } else {
                        reject("data is null")
                    }
                },
                onerror: function (response) {
                    console.log("请求失败", response)
                    reject("data is catch")
                }
            })
        })
    }
        //根据列表获取股票价格
        const updateStockPriceForList = async (upUrl,stockList) => {
            return new Promise((resolve, reject) => {
                GM_xmlhttpRequest({
                    url: upUrl,
                    method: "POST",
                    headers: {
                        "Content-type": "application/x-www-form-urlencode;charset=utf-8"
                    },
                    data: "data="+stockList,//用于POSt请求时传达数据
                    onload: function (response) {
                        const ret = response.response
                        if (ret.length > 0) {
                            console.log("stock 价格更新成功:", ret)
                            resolve("update ok--",stockList)
                        } else {
                            reject("data is null")
                        }
                    },
                    onerror: function (response) {
                        console.log("请求失败", response)
                        reject("data is catch")
                    }
                })
            })
        }
    setInterval(()=>{
        FirstStockGet(stockLeistUrl).then((dataList) => {
            let promises = []
            for (let i = 0; i < dataList.length; i++) {
                // console.log("data%d:%s", i, dataList[i])
                promises.push(GetStockPrice(dataList[i]))
            }
            Promise.all(promises).then((stockData) => {
                let parm = JSON.stringify(stockData)
                console.log("stock price list :",parm)
                updateStockPriceForList(updateURL,parm)
                // for(let i = 0;i < stockData.length;i++ ){
                //     console.log('stock price list :',stockData[i])
                // }            
            }).catch((errorStr) => {
                console.log(errorStr)
            })
        }).catch((errorStr) => {
            console.log(errorStr)
        })
   
    },5000)
})()
